fix(v0.1.2): tool casing, project picker, sessions, control locking#70
Merged
Conversation
…cking Audits and fixes from the 0.1.1 playtest screenshot: **Tool input field-name fix.** tool_write was failing with "missing required key filePath" because DeepSeek occasionally emits snake_case schema fields with camelCase keys in tool_use calls. All 6 Mac tool wrappers (Read/Write/Edit/Bash/Glob/Grep) now accept either case via a tolerant pickStr/pickNum/pickBool helper. **Project folder picker.** Before chat is usable, users now pick a project folder via the native file dialog. The path persists to ~/.deepcode/settings.json#projectPath and is threaded as `cwd` into every agent turn (was hard-coded `/`). Sidebar shows the active project + a ⇄ switch button to re-open the picker. **Session persistence.** Added Tauri commands session_create + session_append. mac-agent now creates a JSONL on first turn (id like 2026-05-28-<8hex>) and appends user + assistant messages. Sidebar refreshes via a sessionEpoch counter on turn_done, so freshly-started conversations appear in the Today bucket. **Mid-turn controls locked.** New controlsLocked flag computed from busy + pendingApproval; mode / model / effort dropdowns all respect it. Was previously freely switchable mid-turn, which contradicted whatever the agent loop already had baked in. **Inspector rail wired.** All 6 rail icons now route to their respective screens (Plan→Permissions, Sessions, Plugins, Skills, MCP, About, Settings, cog→Settings). Expand-chevron ‹ still deferred. **Proper dropdowns** for mode / model / effort — new Dropdown component renders a click-popover with inline descriptions + meta, replacing brittle click-to-cycle UX. 5 official modes now surfaced (default / acceptEdits / plan / dontAsk / bypassPermissions). **ChatScreen** folded into ReplScreen — the legacy split chat/terminal view isn't on the new shell. Kept as a stub for symmetry. Bundle dropped from 673 KB → 345 KB as a side effect (xterm out of the path). **System prompt** now informs the LLM of the working directory + that tool schemas are snake_case, so it stops guessing key casings. Version bumped to 0.1.2 across tauri.conf / both package.jsons / Cargo. CHANGELOG entry added. All typecheck + 533 tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Comprehensive fix pass triggered by the 0.1.1 playtest. Resolves every issue called out in the user's screenshot.
Issues fixed
tool_write"missing required key filePath" — LLM occasionally emits camelCase keys when the schema says snake_case. All 6 Mac tool wrappers now accept either via tolerant pickStr/pickNum/pickBool. System prompt also reminds the LLM the schemas are snake_case.Sessions didn't appear in the sidebar — mac-agent didn't persist anything. Added Tauri commands
session_create/session_appendwriting JSONL to~/.deepcode/sessions/. Sidebar refreshes via asessionEpochcounter when each turn ends.Inspector rail completely unclickable — All 6 buttons now route to their respective screens. Active screen highlights.
Controls switchable mid-turn —
controlsLocked = busy || pendingApprovalnow drivesdisabledon mode/model/effort dropdowns.No project folder picker — Added
ProjectPickerOverlay. Persists choice to settings.json. Threadscwdthrough agent.start → runAgent. Sidebar shows project chip +⇄switch button.Mode/model/effort UX was basic — New
Dropdowncomponent with click-popover, inline descriptions, meta annotations. 5 official modes surfaced (was 3 cycling).Additional improvements
projectPathinto the system prompt so the LLM knows where it's operating~Versioning
Test plan
pnpm typecheckclean (7 workspaces)pnpm test— 533+ tests passpnpm --filter @deepcode/desktop buildsucceeds🤖 Generated with Claude Code